CVE-2019-14287 sudo 配置不当-权限提升漏洞
0x00. 漏洞描述
在sudo使用任意用户ID实现运行命令的方式中发现了一个缺陷。如果编写了一个sudoers条目以允许攻击者以除root以外的任何用户身份运行命令,则攻击者可以使用此缺陷来绕过该限制。
0x01. 漏洞详情
如果将sudo配置为允许用户通过Runas规范中的ALL关键字以任意用户身份运行命令,则可以通过指定用户ID -1或4294967295以root用户身份运行命令。
即使Runas规范明确禁止root访问,只要Runas规范中首先列出ALL
关键字,具有足够sudo特权的用户就可以使用它来以root身份运行命令。
以这种方式运行的命令的日志条目将列出目标用户为4294967295,而不是root。此外,将不会为该命令运行PAM会话模块。
注:
利用该漏洞需要用户具有sudo特权,该特权使他们能够使用任意用户ID运行命令。通常,这意味着用户的sudoers条目在Runas说明符中具有特殊值 ALL
。
如果sudoers策略允许,Sudo支持使用用户指定的用户名或用户ID运行命令。例如,以下sudoers条目允许id命令以任何用户身份运行,因为它在Runas说明符中包含ALL
关键字。
1 | alice myhost = (ALL) /usr/bin/id |
不仅是用户 能够以任何有效用户身份运行id命令,她还能够使用#uid语法以任意用户ID身份运行它,例如:
1 | sudo -u#1234 id -u |
将返回1234
。但是,setresuid(2)
和setreuid(2)
系统调用(sudo在运行命令之前用来更改用户ID)特别对待用户ID -1(或其等效的4294967295),并且不更改以下内容的用户ID:这两个值,
1 | sudo -u#-1 id -u |
或者
1 | sudo -u#4294967295 id -u |
实际上将返回0。这是因为sudo命令本身已经以用户ID 0运行,因此当sudo尝试更改为用户ID -1时,不会发生任何更改。
这将导致生成sudo日志条目,这些条目报告命令是由用户ID 4294967295(而不是root(或用户ID 0))运行的。另外,由于通过-u
选项指定的用户ID 在密码数据库中不存在,因此不会运行任何PAM会话模块。
如果编写了sudoers条目以允许用户以除root以外的任何用户身份运行命令,则可以使用该错误来避免此限制。例如,给定以下sudoers条目:
1 | bob myhost =(ALL,!root)/ usr / bin / vi |
允许用户bob以root身份以外的任何用户身份运行vi。但是,由于该错误,bob实际上可以通过运行
1 | sudo -u#-1 vi |
来以root身份运行 vi
,这违反了安全策略。
仅在Runas说明符中存在ALL
关键字的sudoers条目会受到影响。例如,以下sudoers条目不受影响:
1 | alice myhost = / usr / bin / id |
在此示例中,只允许爱丽丝以root身份运行id命令。以其他用户身份运行命令的任何尝试都将被拒绝。
0x02. 修复
该漏洞已在 sudo 1.8.28中修复。